import os
from datetime import timedelta


class Config:
    """基础配置类"""
    # 应用配置
    SECRET_KEY = os.environ.get('SECRET_KEY') or 'dev_secret_key_change_in_production'
    
    # 会话配置
    PERMANENT_SESSION_LIFETIME = timedelta(days=1)
    SESSION_COOKIE_HTTPONLY = True  # 防止JavaScript访问
    SESSION_COOKIE_SECURE = False  # 开发环境设为False，生产环境设为True（需要HTTPS）
    SESSION_COOKIE_SAMESITE = 'Lax'  # 防止CSRF攻击
    
    # 数据库类型配置 - 支持切换
    DATABASE_TYPE = os.environ.get('DATABASE_TYPE', 'sqlite')
    
    # 数据库配置 - 根据类型选择
    if DATABASE_TYPE == 'postgresql':
        # PostgreSQL配置
        DATABASE = os.environ.get('DATABASE_URL') or \
            'postgresql://admin:password@localhost:5432/vmi_db'
    else:
        # SQLite配置（默认）
        DATABASE = os.environ.get('DATABASE_URL') or 'database.db'
    
    # Redis配置
    REDIS_ENABLED = os.environ.get('REDIS_ENABLED', 'false').lower() == 'true'
    REDIS_HOST = os.environ.get('REDIS_HOST', 'localhost')
    REDIS_PORT = int(os.environ.get('REDIS_PORT', '6379'))
    REDIS_DB = int(os.environ.get('REDIS_DB', '0'))
    REDIS_PASSWORD = os.environ.get('REDIS_PASSWORD')
    
    # 日志配置
    LOG_LEVEL = os.environ.get('LOG_LEVEL') or 'INFO'
    
    # 分页配置
    DEFAULT_PAGE_SIZE = 20
    MAX_PAGE_SIZE = 100


class DevelopmentConfig(Config):
    """开发环境配置"""
    DEBUG = True
    TESTING = False
    

class TestingConfig(Config):
    """测试环境配置"""
    DEBUG = False
    TESTING = True
    
    # 测试数据库
    if Config.DATABASE_TYPE == 'postgresql':
        DATABASE = os.environ.get('TEST_DATABASE_URL') or \
            'postgresql://admin:password@localhost:5432/vmi_test_db'
    else:
        DATABASE = ':memory:'  # 使用内存数据库进行测试
    

class ProductionConfig(Config):
    """生产环境配置"""
    DEBUG = False
    TESTING = False
    SESSION_COOKIE_SECURE = True  # 生产环境启用HTTPS
    
    # 生产环境强制使用PostgreSQL
    DATABASE_TYPE = 'postgresql'
    DATABASE = os.environ.get('DATABASE_URL')
    

# 配置映射，通过环境变量选择配置
config = {
    'development': DevelopmentConfig,
    'testing': TestingConfig,
    'production': ProductionConfig,
    'default': DevelopmentConfig
}